package com.example.springboottest.example.btrace;

import com.example.springboottest.student.model.Student;
import com.sun.btrace.annotations.*;

import static com.sun.btrace.BTraceUtils.println;

/**
 * Usage: btrace <options> <pid> <btrace source or .class file> <btrace arguments>
 * where possible options include:
 * --version             Show the version
 * -v                    Run in verbose mode
 * -o <file>             The path to store the probe output (will disable showing the output in console)
 * -u                    Run in trusted mode
 * -d <path>             Dump the instrumented classes to the specified path
 * -pd <path>            The search path for the probe XML descriptors
 * -classpath <path>     Specify where to find user class files and annotation processors
 * -cp <path>            Specify where to find user class files and annotation processors
 * -I <path>             Specify where to find include files
 * -p <port>             Specify port to which the btrace agent listens for clients
 * -statsd <host[:port]> Specify the statsd server, if any
 *
 * 要么  修改btrace.sh文件增加cp的路径，不然找不到Student的路径
 * 要么 在btrace上加上class的路径 btrace -cp /Users/fangdaye/work/workspace/spring-boot-test/build/classes/java/main/  9761 SpringBootBTrace.java
 * web应用不必须加上-u
 * btrace  9440 CalculatorBTrace.java
 *
 * 1、Kind.ENTRY：入口拦截，默认值； *
 * 2、Kind.RETURN：拦截返回值，只有把拦截位置定义为Kind.RETURN，才能获取方法的返回结果@Return和执行时间@Duration；
 * 3、Kind.THROW：发生异常时拦截；
 * 4、Kind.LINE：拦截某一行，可以监控代码是否执行到指定的位置；
 * 5、Kind.CALL：分析方法中调用其它方法的执行情况，比如在execute方法中，想获取add方法的执行耗时，必须把where设置成Where.AFTER；
 *
 * SpringBootBTrace.java文件可以在任务位置执行！！！！
 * btrace -cp /Users/fangdaye/work/workspace/spring-boot-test/build/classes/java/main/  进程号 SpringBootBTrace.java
 * 但是不支持接口方式的跟踪，只能具体到实现类！！！
 */
@BTrace(unsafe = true) // 表示这是一个BTrace跟踪脚本，并启用unsafe模式(因为使用了BTraceUtils以外的方法，即String.valueOf(obj))
public class SpringBootBTrace {
    @OnMethod(clazz = "com.example.springboottest.student.service.impl.StuMybatisServiceImpl", method = "doFindById", location = @Location(Kind.RETURN))
    public static void traceTest(String id, @Return Student student) {
        println("begin....");
        println(String.format("员工id：%s\t员工信息：%s", id, student.toString()));
        println("end....");
    }
}